//! 程序入口模块 - 初始化系统并启动命令行界面

// 声明所有子模块
mod block;          // 区块数据结构
mod blockchain;     // 区块链核心逻辑
mod pow;            // 工作量证明算法
mod transaction;    // 交易处理
mod wallet;         // 钱包管理
mod merkle_tree;    // 默克尔树计算
mod smart_contract; // 智能合约（预留功能）
mod network;        // 网络通信（预留功能）
mod cli;            // 命令行交互
//mod storage;        // 数据持久化

mod cli_bbs;  // 新增模块声明
mod bbs;       // 新增 BBS 核心模块
mod transaction_bbs;  // 新增 BBS 交易类型

// 导入命令行接口模块
use clap::Parser;//, Subcommand};
use crate::cli::CLI;
use crate::blockchain::Blockchain;

#[derive(Parser)]
// main.rs 优化帮助信息
#[command(
    name = "mochain",
    version = "0.1.0",
    about = "去中心化区块链论坛系统",
    subcommand_required = true
)]
enum MoChainCommand {
    /// 进入交互式命令行
    Interactive,
    /// 提交新帖子 (BBS 功能)
    SubmitPost {
        #[arg(short, long)]
        content_path: String,
        #[arg(short, long)]
        author: String,
    },
    /// 提交新评论
    SubmitComment {
        #[arg(short, long)]
        post_hash: String,
        #[arg(short, long)]
        content_path: String,
        #[arg(short, long)]
        author: String,
    },
    /// 执行挖矿（兼容旧CLI命令）
    Mine {
        #[arg(short, long)]
        miner: String,
    }
}


/// 主函数执行流程：
/// 1. 显示欢迎信息
/// 2. 初始化命令行接口
/// 3. 进入交互式命令行循环
/// 4. 退出时自动保存区块链数据
fn main() 
    -> anyhow::Result<()> 
{
    let args = MoChainCommand::parse();
    
    match args {
        MoChainCommand::Interactive => {
	    println!("欢迎使用区块链系统!");
	    let mut cli = CLI::new();  // 创建CLI实例（自动加载存储数据）
	    cli.run();                 // 启动交互循环
	    Ok(())
        }
        MoChainCommand::SubmitPost { content_path, author } => {
            // 调用 BBS 提交逻辑
//            crate::cli_bbs::handle_submit_post(&content_path, &author);
//            let _blockchain = Blockchain::load()?;	  // 标记为已处理
            let mut chain = Blockchain::load("blockchain.json")?;
            cli_bbs::handle_submit_post(&mut chain, &content_path, &author)?;
            chain.save("blockchain.json")?;
//	    let _ = Blockchain::load("blockchain.json")?;  // 明确标记为有意忽略
//            cli_bbs::handle_submit_post(&content_path, &author)?;
	    Ok(())
        }
        MoChainCommand::SubmitComment { post_hash, content_path, author } => {
//            cli_bbs::handle_submit_comment(&post_hash, &content_path, &author);
            let mut chain = Blockchain::load("blockchain.json")?;
            cli_bbs::handle_submit_comment(&mut chain, &post_hash, &content_path, &author)?;
            chain.save("blockchain.json")?;
/*            let blockchain = Blockchain::load("blockchain.json")?;
            cli_bbs::handle_submit_comment(
		blockchain,  	  // 传递可变引用
		&post_hash, 
		&content_path, 
		&author)?;
*/
	    Ok(())
        }
	// 在 main() 的 match 块中添加：
	MoChainCommand::Mine { miner } => {
	    let mut chain = Blockchain::load("blockchain.json")?;

	    // ▼▼▼ 在打包前记录待处理交易数量 ▼▼▼
	    let pending_count = chain.pending_transactions.len();
    
	    chain.add_block(&miner);  // 打包交易池
	    chain.save("blockchain.json")?;

	    //println!("✅ 已打包 {} 笔交易", chain.pending_transactions.len());
	    // 修正输出信息 ▼▼▼
	    println!("✅ 已打包 {} 笔交易，新区块高度: {}", 
	        pending_count,
	        chain.chain().len()
	    );

	    Ok(())
	}
    }
}
